package escaleras.pkginterface;

import Dominio.Fachada.Escalera;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.ImageObserver;
import java.awt.image.ImageProducer;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

public class Escaleras extends javax.swing.JFrame {

    private Escalera sistemaEscalera = null;

    public Escaleras() {
        initComponents();
        try {
            Image icon = new ImageIcon(getClass().getResource("/escaleras/pkginterface/Recursos/EscalerasGame.png")).getImage();
            this.setIconImage(icon);
            //Levanto el objeto serailizado
            File archivo = new File("elSistema");
            if (archivo.exists()) {
                ObjectInputStream oi = new ObjectInputStream(new BufferedInputStream(new FileInputStream("elSistema")));
                try {
                    sistemaEscalera = (Escalera) oi.readObject();
                    oi.close();
                } catch (Exception ex) {
                    oi.close();
                    if (archivo.delete()) {
                        System.out.println("El archivo seralizado no se puede reconstrir, se borrará.");
                    } else {
                        System.out.println("El archivo seralizado no se puede borrar.");
                    }
                }
            }
            //Si el objeto serializado no existe entonces creo una instancia nueva
            if (sistemaEscalera
                    == null) {
                sistemaEscalera = new Escalera();
            }
        } catch (Exception ex) {
            System.out.println("El archivo seralizado no se puede borrar.");
        }
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        desktopPane = new javax.swing.JDesktopPane();
        btnJugar = new javax.swing.JButton();
        btnNuevoUsuario = new javax.swing.JButton();
        btnRanking = new javax.swing.JButton();
        btnSalir = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        desktopPane.setBackground(new java.awt.Color(255, 255, 255));
        desktopPane.setAutoscrolls(true);
        desktopPane.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        desktopPane.setMinimumSize(new java.awt.Dimension(600, 400));
        desktopPane.setName("Escalera"); // NOI18N
        desktopPane.setNextFocusableComponent(btnJugar);

        btnJugar.setBackground(new java.awt.Color(255, 255, 255));
        btnJugar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/escaleras/pkginterface/Recursos/play_blue.png"))); // NOI18N
        btnJugar.setBorder(null);
        btnJugar.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        btnJugar.setOpaque(false);
        btnJugar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnJugarActionPerformed(evt);
            }
        });
        btnJugar.setBounds(250, 150, 95, 90);
        desktopPane.add(btnJugar, javax.swing.JLayeredPane.DEFAULT_LAYER);

        btnNuevoUsuario.setBackground(new java.awt.Color(255, 255, 255));
        btnNuevoUsuario.setIcon(new javax.swing.ImageIcon(getClass().getResource("/escaleras/pkginterface/Recursos/users-icon.png"))); // NOI18N
        btnNuevoUsuario.setBorder(null);
        btnNuevoUsuario.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        btnNuevoUsuario.setOpaque(false);
        btnNuevoUsuario.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnNuevoUsuarioActionPerformed(evt);
            }
        });
        btnNuevoUsuario.setBounds(250, 60, 95, 90);
        desktopPane.add(btnNuevoUsuario, javax.swing.JLayeredPane.DEFAULT_LAYER);

        btnRanking.setBackground(new java.awt.Color(255, 255, 255));
        btnRanking.setIcon(new javax.swing.ImageIcon(getClass().getResource("/escaleras/pkginterface/Recursos/ranking_prize_gray.png"))); // NOI18N
        btnRanking.setBorder(null);
        btnRanking.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        btnRanking.setOpaque(false);
        btnRanking.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnRankingActionPerformed(evt);
            }
        });
        btnRanking.setBounds(250, 240, 95, 90);
        desktopPane.add(btnRanking, javax.swing.JLayeredPane.DEFAULT_LAYER);

        btnSalir.setBackground(new java.awt.Color(255, 255, 255));
        btnSalir.setIcon(new javax.swing.ImageIcon(getClass().getResource("/escaleras/pkginterface/Recursos/Log-Out-icon1.png"))); // NOI18N
        btnSalir.setBorder(null);
        btnSalir.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
        btnSalir.setOpaque(false);
        btnSalir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSalirActionPerformed(evt);
            }
        });
        btnSalir.setBounds(460, 390, 95, 90);
        desktopPane.add(btnSalir, javax.swing.JLayeredPane.DEFAULT_LAYER);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(desktopPane, javax.swing.GroupLayout.DEFAULT_SIZE, 600, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(desktopPane, javax.swing.GroupLayout.DEFAULT_SIZE, 500, Short.MAX_VALUE)
        );

        desktopPane.getAccessibleContext().setAccessibleName("");

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void btnRankingActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRankingActionPerformed
        try {
            Rankings ventana = new Rankings(sistemaEscalera);
            desktopPane.add(ventana);
            ventana.setBounds(0, 0, this.getWidth() - 15, this.getHeight() - 37);
            ventana.setVisible(true);
            this.setLocationRelativeTo(null);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en Escaleras", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_btnRankingActionPerformed

    private void btnJugarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnJugarActionPerformed
        // TODO add your handling code here:
        int dimension = 1;
        boolean volver = false;
        String blanco = null;
        String negro = null;
        int cantidadJugadas = 0;
        String saltoLinea = "\n";
        int cantidadLadrillosL = Integer.MAX_VALUE;
        int minutosPartida = 5;

        try {
            do {
                volver = false;
                if (sistemaEscalera.getListaDeJugadores().size() < 2) {
                    throw new Exception("Para comenzar una partida debe de ingresar al menos 2 jugadores.");
                }
                Object[] possibleValues = {"4x4", "6x6", "8x8"};
                Object selectedValue = JOptionPane.showInputDialog(null,
                        "Elejir el tamaño del tablero", "Seleccionar",
                        JOptionPane.INFORMATION_MESSAGE, null,
                        possibleValues, possibleValues[0]);
                if (selectedValue != null) {
                    //If there is an array of option buttons:
                    for (int indice = 0; indice < possibleValues.length; indice++) {
                        String opcion = (String) possibleValues[indice];
                        if (opcion.equals(selectedValue)) {
                            dimension = (dimension + indice + 1) * 2;
                        }
                    }
                    //return CLOSED_OPTION;
                    //Seleccionar el jugador blanco.
                    Object[] possibleJugadores = new Object[sistemaEscalera.getListaDeJugadores().size()];
                    for (int i = 0; i < sistemaEscalera.getListaDeJugadores().size(); i++) {
                        possibleJugadores[i] = sistemaEscalera.getListaDeJugadores().get(i).getAlias();
                    }
                    Object selectedBlanco = JOptionPane.showInputDialog(null,
                            "Elejir el jugador Blanco", "Blanco",
                            JOptionPane.INFORMATION_MESSAGE, null,
                            possibleJugadores, possibleValues[0]);
                    if (selectedBlanco != null) {
                        blanco = (String) selectedBlanco;
                        //Saco el jugador elejido de la lista.
                        possibleJugadores = new Object[sistemaEscalera.getListaDeJugadores().size() - 1];
                        int j = 0;
                        for (int i = 0; i < sistemaEscalera.getListaDeJugadores().size(); i++) {
                            if (!selectedBlanco.equals(sistemaEscalera.getListaDeJugadores().get(i).getAlias())) {
                                possibleJugadores[j] = sistemaEscalera.getListaDeJugadores().get(i).getAlias();
                                j++;
                            }
                        }
                        Object selectedNegro = JOptionPane.showInputDialog(null,
                                "Elejir el jugador Negro", "Nego",
                                JOptionPane.INFORMATION_MESSAGE, null,
                                possibleJugadores, possibleValues[0]);

                        if (selectedNegro != null) {
                            negro = (String) selectedNegro;

                            do {
                                boolean esLetra = false;
                                String jugadas = JOptionPane.showInputDialog(null, "Ingresar la cantidad de jugadas por jugador", "Cantida de jugadas", JOptionPane.INFORMATION_MESSAGE);
                                try {
                                    volver = (jugadas.equals("") || Integer.parseInt(jugadas.toString()) < 1);
                                } catch (Exception ex) {
                                    volver = true;
                                    esLetra = true;
                                    JOptionPane.showMessageDialog(this, "Tipo de dato incorrecto");
                                }
                                if (!volver) {

                                    cantidadJugadas = Integer.parseInt(jugadas.toString());

                                    do {
                                        String ladrillosL = JOptionPane.showInputDialog(null, "Ingresar la cantidad de ladrillo L por jugador", "Cantidad de L por defecto es infinitas", JOptionPane.INFORMATION_MESSAGE);
                                        volver = !(ladrillosL.equals("") /*!ladrillosL.equals(new String())*/);

                                        if (!volver) {

                                            cantidadLadrillosL = Integer.MAX_VALUE;

                                        } else {
                                            try {
                                                if (Integer.parseInt(ladrillosL.toString()) >= 1) {
                                                    cantidadLadrillosL = Integer.parseInt(ladrillosL.toString());
                                                    volver = false;
                                                } else {
                                                    JOptionPane.showMessageDialog(this, "La cantidad de ladrillosL debe ser mayor a cero");
                                                }
                                            } catch (Exception ex) {
                                                volver = true;
                                                JOptionPane.showMessageDialog(this, "Tipo de dato incorrecto");
                                            }
                                        }

                                    } while (volver);
                                    do {
                                        String minutos = JOptionPane.showInputDialog(null, "Ingrese el tiempo de juego en minutos", "Cantida de minutos, por defecto 5", JOptionPane.INFORMATION_MESSAGE);
                                        volver = !(minutos.equals(""));

                                        if (!volver) {

                                            minutosPartida = minutosPartida;

                                        } else {
                                            try {
                                                if (Integer.parseInt(minutos.toString()) > 0) {

                                                    minutosPartida = Integer.parseInt(minutos.toString());
                                                    volver = false;

                                                } else {
                                                    JOptionPane.showMessageDialog(this, "El tiempo debe ser mayor a cero");
                                                    volver = true;
                                                }
                                            } catch (Exception ex) {
                                                volver = true;
                                                JOptionPane.showMessageDialog(this, "Tipo de dato incorrecto");
                                            }
                                        }

                                    } while (volver);

                                } else {
                                    if (!esLetra) {
                                        JOptionPane.showMessageDialog(this, "La cantidad de jugadas debe ser mayor a cero");
                                    }
                                }

                            } while (volver);
                        }

                    }
                }
            } while (volver);
            if (dimension != 1 && blanco != null && negro != null && cantidadJugadas != 0) {
                this.setBounds(100, 100, 800, 700);

                sistemaEscalera.crearPartida(blanco, negro, dimension, cantidadLadrillosL, cantidadJugadas);
                sistemaEscalera.agregarPartida(sistemaEscalera.getPartida());

                StringBuilder builString = new StringBuilder(String.format("La partida comienza entre '%s' y '%s', la cantidad de jugadas por jugador es %s.",
                        sistemaEscalera.getPartida().getBlanco().getAlias(),
                        sistemaEscalera.getPartida().getNegro().getAlias(),
                        (sistemaEscalera.getPartida().getCantidadMaximaJugadas() == Integer.MAX_VALUE) ? "infinitas" : sistemaEscalera.getPartida().getCantidadMaximaJugadas()));
                builString.append(saltoLinea);
                builString.append(String.format("Cada jugador dispone de %s ladrillos cuadrados, %s ladrillo rectangular y %s ladrillo/s L.",
                        sistemaEscalera.getPartida().getCantidadC(),
                        sistemaEscalera.getPartida().getCantidadR(),
                        (sistemaEscalera.getPartida().getCantidadL() == Integer.MAX_VALUE) ? "infinitos" : sistemaEscalera.getPartida().getCantidadL()));
                builString.append(saltoLinea);
                JOptionPane.showMessageDialog(null, builString.toString(), "Comienzo de la partida", JOptionPane.PLAIN_MESSAGE);

                Partidas ventana = new Partidas(sistemaEscalera, dimension, minutosPartida);
                desktopPane.add(ventana);
                ventana.setBounds(0, 0, this.getWidth() - 15, this.getHeight() - 37);
                ventana.setVisible(true);
                this.setLocationRelativeTo(null);
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en Escaleras", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_btnJugarActionPerformed

    private void btnNuevoUsuarioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNuevoUsuarioActionPerformed
        // TODO add your handling code here:
        try {
            Usuarios ventana = new Usuarios(sistemaEscalera);
            desktopPane.add(ventana);
            ventana.setBounds(0, 0, this.getWidth() - 15, this.getHeight() - 37);
            ventana.setVisible(true);
            this.setLocationRelativeTo(null);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en Escaleras", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_btnNuevoUsuarioActionPerformed
    /*Finaliza la ejecución del jugo*/

    private void salir() throws FileNotFoundException, IOException {
        ObjectOutputStream oo = null;
        try {
            oo = new ObjectOutputStream(new FileOutputStream("elSistema"));
            oo.writeObject(sistemaEscalera);
            //System.exit(0);
        } catch (FileNotFoundException ex) {
            throw ex;
        } catch (IOException ex) {
            throw ex;
        } finally {
            try {
                oo.close();
            } catch (IOException ex) {
                throw ex;
            }
        }
    }
    private void btnSalirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSalirActionPerformed
        // TODO add your handling code here:
        try {
            salir();
            dispose();
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en Escaleras", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_btnSalirActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnJugar;
    private javax.swing.JButton btnNuevoUsuario;
    private javax.swing.JButton btnRanking;
    private javax.swing.JButton btnSalir;
    private javax.swing.JDesktopPane desktopPane;
    // End of variables declaration//GEN-END:variables
}
